package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {

    @Autowired
    CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        List<CourseCategoryTreeDto> courseCategoryTreeDtos1 = courseCategoryMapper.selectTreeNodes(id);
        List<CourseCategoryTreeDto> courseCategoryTreeDtos2 = courseCategoryMapper.selectParentNodes(id);
        List<CourseCategoryTreeDto> courseCategoryTreeDto = courseCategoryMapper.selectNodeById(id);

        List<CourseCategoryTreeDto> courseCategoryTreeDtos = new ArrayList<>();
        courseCategoryTreeDtos.addAll(courseCategoryTreeDto);
        courseCategoryTreeDtos.addAll(courseCategoryTreeDtos2);
        courseCategoryTreeDtos.addAll(courseCategoryTreeDtos1);
//        todo java8新特性,还有对象的引用,把map中的对象遍历取出,然后再一个个放入子节点,也不用再放入map中,取出的对象改变,map中的对象也随之改变
        //将list转map,以备使用, filter(item->!id.equals(item.getId())) 排除id=1根节点 , 将list转map, (key1, key2) -> key2) 这里的逻辑是保留后出现的值（key2）
//        todo list转换成map,那么同一个对象的引用会不会发生变化,还是赋予一个新对象
        Map<String, CourseCategoryTreeDto> mapTemp = courseCategoryTreeDtos.stream().filter(item->!id.equals(item.getId())).collect(Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2));
        //这是最终返回的list
        List<CourseCategoryTreeDto> newCategoryTreeDtos = new ArrayList<>();
        //如同上一步排除根节点,然后依次遍历每个元素,
        courseCategoryTreeDtos.stream().filter(item->!id.equals(item.getId())).forEach(item->{//todo 很巧妙
            if(item.getParentid().equals(id)){
//                父节点是1就加入,1-1加入1的链表
                newCategoryTreeDtos.add(item);
            }
            //找到当前节点的父节点,从map中获取,courseCategoryParentTreeDto对象更改,map中的数据也会变化,引用了一致
            CourseCategoryTreeDto courseCategoryParentTreeDto = mapTemp.get(item.getParentid());
            if(courseCategoryParentTreeDto!=null){//存在父节点 1  1-1
                if(courseCategoryParentTreeDto.getChildrenTreeNodes() ==null){//1的子节点目前为null
                    courseCategoryParentTreeDto.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                }
                //下边开始往ChildrenTreeNodes属性中放子节点 1的list中放入1-1
                courseCategoryParentTreeDto.getChildrenTreeNodes().add(item);
            }
        });
        return newCategoryTreeDtos;
    }
}
